11. 类函数声明
类函数
要在 Matrix 类中编写函数,首先需要声明这些函数。对于 Matrix 类,你可以将这些函数看作属于三个独立的类别:
- 构造函数
- set 和 get 函数
- Matrix 功能函数
声明这些函数的方法和前一课中声明函数一样。不同的是,现在你必须决定某个函数是私有的、受保护的还是公共的。函数声明在类声明内部。
你需要在 matrix.cpp 中定义你的函数。但首先,让我们简要地谈一下每种类型的函数。构造函数用于初始化对象。Python 使用
def __init__
语法实现这一功能。C++ 语法有点不同,你将在本课的下一部分中了解这些差异。
set 和 get 取函数专门用于访问和赋值给私有变量。因为一个对象不能直接访问私有变量,set 和 get 函数提供了间接访问功能。set 和 get 函数的语法和其他 C++ 函数相同。使用 set 和 get 是面向对象编程的惯例,而不是特定的 C++ 语法。
最后,还有一些由矩阵功能组成的函数,如打印矩阵、矩阵相加、矩阵乘法等等。在练习中,你会执行这些函数。
下面,我们进入到下一部分的练习,学习如何声明和定义 Matrix 构造函数。
Set 和 Get 函数声明
Set 和 Get 函数允许你的对象访问私有变量。对象不能直接访问私有变量,所以需要使用 set 和 get 函数。本课前面的 Gaussian 对象展示了具体实现方法。
以下是 set 和 get 函数的声明:
class Gaussian
{
private:
...
public:
...
void setMu(float);
void setSigma2(float);
float getMu();
float getSigma2();
....
};
set 函数改变一个变量的值,而 get 函数则返回一个变量的值。你会注意到,set 和 get 函数的语法与所有常规函数都是一样的。实际上,set 和 get 是约定,而不是 C++ 特有的。传统上,我们将这些函数命名为 getVariablename() 和 setVariablename(),虽然没有明确要求。
你需要将 set 和 get 函数声明为公共的,以便对象可以访问这些函数。
Set 函数
SOLUTION:
- set 函数只改变一个变量的值。
- 空的返回类型意味着函数不返回任何内容。
矩阵功能函数
第三组要声明的函数是用于矩阵功能的。其语法与 get 和 set 函数语法以及任何正常的 C++ 函数完全相同。你需要为输入变量指定返回数据类型、函数名称和数据类型。
例如,Gaussian 类有三个函数:evaluate、multiply 和 add。以下是如何在 gaussian.h 文件中声明这些函数的示范:
class Gaussian
{
....
public:
...
//待评估函数
float evaluate (float);
Gaussian multiply (Gaussian);
Gaussian add (Gaussian);
};
在 Matrix 类中声明函数
现在,轮到你在 matrix.h 文件中声明函数了。在下面的 matrix.h 文件中填充 TODO 部分。答案在代码下面。
Start Quiz:
#include <vector>
class Matrix
{
private:
std::vector< std::vector<float> > grid;
std::vector<float>::size_type rows;
std::vector<float>::size_type cols;
public:
/*
** TODO: Declare constructor functions
** For the matrix class, you will need two constructor functions.
** 1. An empty constructor function
** 2. A constructor function that accepts a 2-dimensional vector
*/
/*
** TODO: Declare set and get functions for the three private variables.
** You will need 1 set function and 3 get functions.
** The names of these functions should be setGrid, getGrid, getRows,
** and getCols.
**
** The setGrid does not return anything and has a 2-D vector input
** getGrid returns a 2-D vector and has no input
** getRows returns a size_type and has no input
** get Cols returns a size_type and has no input
*/
/*
** TODO: Declare the matrix functions. In a following exercise, you
** will program matrix_transpose, matrix_addition and matrix_print
** functions. So you will need to declare these two functions.
**
** matrix_transpose has no input and outputs a 2D vector
** matrix_addition receives a Matrix and outputs a 2D vector
** matrix_print has no inputs and no outputs
*/
};
#include "matrix.h"
/* TODO: Define the default constructor. Remember the syntax is
** Classname::ClassName() {
**
** initialize variables
**
** }
**
**
** You need to initialize the grid variable to a default value such as
** a 4x4 matrix with all zeros.
**
** Then initialize the rows variable, and the cols variable using the
** vector size method. For example myvector.size() will give the size of
** a vector. For a 2-dimensional vector, myvector.size() would be the
** number of rows in a matrix.
**
*/
/* TODO: Define a constructor that receives a 2-Dimensional vector
** and assigns the vector to the grid variable.
**
** Remember the syntax is
** Classname::ClassName(datatype inputvariablename) {
**
** classvariable = inputvariablename
**
** }
**
** Then initialize the rows variable, and the cols variable exactly
** as you did for the default constructor.
**
*/
#include <iostream>
#include <vector>
#include "matrix.h"
int main () {
// TODO: Nothing to do here
return 0;
}
参考答案
# include <vector>
class Matrix
{
private:
std::vector< std::vector<float> > grid;
std::vector<int>::size_type rows;
std::vector<int>::size_type cols;
public:
// constructor function declarations
矩阵
Matrix (std::vector< std::vector<float> >);
// set and get function declarations
void setGrid(std::vector< std::vector<float> >);
std::vector< std::vector<float> > getGrid();
std::vector<int>::size_type getRows();
std::vector<int>::size_type getCols();
// matrix function declarations
std::vector< std::vector<float> > matrix_transpose();
std::vector< std::vector<float> > matrix_addition(Matrix);
void matrix_print();
};
定义函数
在下一节中,你将在 matrix.cpp 文件中定义所有这些函数。